home *** CD-ROM | disk | FTP | other *** search
/ Suzy B Software 2 / Suzy B Software CD-ROM 2 (1994).iso / extras / programm / gemfsc19 / gemfsc19.lzh / GEMFUNCS / OBJCLCAL.C < prev    next >
C/C++ Source or Header  |  1993-05-07  |  2KB  |  82 lines

  1. /**************************************************************************
  2.  * OBJCLCAL.C - Calc clipping rectangle(s) for object in a tree.
  3.  *************************************************************************/
  4.  
  5. #include "gemfintl.h"
  6.  
  7. short obj_clcalc(ptree, object, pgrect, pvrect)
  8.     register OBJECT *ptree;
  9.     short             object;
  10.     GRECT            *pgrect;
  11.     VRECT            *pvrect;
  12. {
  13.     short            adjust;
  14.     long            ospec;
  15.     short            otype;
  16.     short            oflags;
  17.     GRECT            workrect;
  18.  
  19.     obj_offxywh(ptree, object, &workrect);    /* get basic placement/sizes */
  20.  
  21.     ptree  = &ptree[object];              /* registerize/precalc some  */
  22.     otype  = obj_gtype(ptree, ROOT);      /* miscellanious things we   */
  23.     ospec  = obj_gvalue(ptree, ROOT);      /* use a lot below.           */
  24.     oflags = ptree->ob_flags;
  25.  
  26.     /*
  27.      * deal with objects that can have graphics that extend outside
  28.      * their ob_width/ob_height values...
  29.      */
  30.  
  31.     switch (otype) {
  32.       case G_BOXTEXT:
  33.       case G_FBOXTEXT:
  34.         adjust = ((TEDINFO*)ospec)->te_thickness;
  35.         break;
  36.       case G_BOX:
  37.       case G_IBOX:
  38.       case G_BOXCHAR:
  39.         adjust = (short)((char)(ospec >> 16));
  40.         break;
  41.       case G_BUTTON:
  42.         adjust = -1;
  43.         if (oflags & EXIT)
  44.             --adjust;
  45.         if (oflags & DEFAULT)
  46.             --adjust;
  47.         break;
  48.       default:
  49.         adjust = 0;
  50.         break;
  51.     }
  52.  
  53.     if (adjust > 0) {        /* if adjust value is positive, object has      */
  54.         adjust = 0;         /* "inner width" and no adjustment is needed. */
  55.     } else {                /* negative value implies outer width, invert */
  56.         adjust = -adjust;    /* it to a positive number for rc_gadjust().  */
  57.     }
  58.  
  59.     if (ptree->ob_state & OUTLINED) {             /* OUTLINED objects get  */
  60.         adjust = 4;                              /* a fixed adjustment.   */
  61.     }
  62.  
  63.     rc_gadjust(&workrect, adjust, adjust);         /* apply adjustment      */
  64.  
  65.     if (ptree->ob_state & SHADOWED) {             /* apply special adjust  */
  66.         workrect.g_w += gl_wbox / 2;             /* for SHADOWED objects. */
  67.         workrect.g_h += gl_hbox / 2;
  68.     }
  69.  
  70.     if (pgrect != NULL) {                         /* if caller wants GRECT,*/
  71.         *pgrect = workrect;                      /* copy results to it.   */
  72.     }
  73.  
  74.     if (pvrect != NULL) {                         /* if caller wants VRECT,*/
  75.         rc_gtov(&workrect, pvrect);              /* convert results to it.*/
  76.     }
  77.  
  78.     return adjust;
  79. }
  80.  
  81.  
  82.